package controllers;

import java.util.*;

import play.mvc.*;

import views.html.*;
import views.html.consultationQcm.*;

import models.*;

/**
 * Controller de la partie "Consultation des QCM" cree par un enseignant.
 * 
 * @author maletell
 * 
 */
public abstract class ConsulterQCM extends Controller {

	/**
	 * Liste les QCMs crees par un enseignant identifie
	 * 
	 * @return page contenant la liste, ou la page d erreur en cas de mauvaise
	 *         identification
	 */
	public static Result listeQcmCrees() {
		final Utilisateur us = Utilisateur.findById(Long.parseLong(session("id")));
		if (us.getStatut() == Statut.Expert) {
			return ok(consulterListeQcmExpert.render(us.getListeQcmCrees()));
		} else if (us.getStatut() == Statut.Administrateur) {
			return ok(consulterListeQcmExpert.render(Qcm.findAll()));
		} else {
			return ok(pageErreurConnexion.render());
		}
	}

	/**
	 * Permet de passer le statut du QCM a "validé" (visible par les etudiants)
	 * 
	 * @param id
	 *            l id du QCM a valider
	 * @return la page du detail du QCM, ou une erreur d authentification
	 */
	public static Result validerQcm(final Long id) {
		final Qcm qcm = Qcm.findById(id);
		qcm.setEstPublie(true);
		Qcm.update(qcm);
		final Utilisateur us = Utilisateur.findById(Long.parseLong(session("id")));
		if ((us.getStatut() == Statut.Expert && qcm.getUtilisateur().equals(us))
				|| (us.getStatut() == Statut.Administrateur)) {
			return detailQcmCree(qcm.getIdQcm());
		} else {
			return ok(pageErreurConnexion.render());
		}
	}

	/**
	 * Supprimer le passage du QCM par un etudiant
	 * 
	 * @param id
	 *            l identifiant de l userQcm
	 * @return la page
	 */
	public static Result supprimerUtilisateurQcm(final Long id) {
		final Utilisateur us = Utilisateur.findById(Long.parseLong(session("id")));
		final Qcm qcm = UtilisateurQcm.findById(id).getQcm();
		if ((us.getStatut() == Statut.Expert && qcm.getUtilisateur().equals(us))
				|| (us.getStatut() == Statut.Administrateur)) {
			UtilisateurQcm.delete(id);
			flash("success", "Enregistrement supprime");
			return detailQcmCree(qcm.getIdQcm());
		} else {
			return ok(pageErreurConnexion.render());
		}
	}

	/**
	 * Voir les informations relatives a un QCM cree par un enseignant
	 * (passages,notes, statistiques)
	 * 
	 * @param id
	 *            le qcm dont on veut les details
	 * @return page de rendu ou erreur si mauvaise authentification
	 */
	public static Result detailQcmCree(final Long id) {
		final Utilisateur us = Utilisateur.findById(Long.parseLong(session("id")));
		final Qcm qcm = Qcm.findById(id);
		double moyenne = 0;
		final Map<Integer, Integer> notes = new HashMap<Integer, Integer>();
		for (int i = 0; i < 21; i++) {
			notes.put(i, 0);
		}
		if ((us.getStatut() == Statut.Expert && qcm.getUtilisateur().equals(us))
				|| (us.getStatut() == Statut.Administrateur)) {
			final List<UtilisateurQcm> listeRep = UtilisateurQcm.findAllByIdQcm(id);
			for (UtilisateurQcm rep : listeRep) {
				moyenne += rep.getNote();
				notes.put((int) rep.getNote(),
						notes.get((int) rep.getNote()) + 1);
			}
			moyenne /= listeRep.size();
			String moy = String.format("%1$,.2f", moyenne);
			final Map<Question, Integer> repJustes = ConsulterQCM
					.reponsesJustesQuestions(listeRep);
			return ok(detailQcmCree.render(qcm, listeRep, moy, notes,
					repJustes));
		} else {
			return ok(pageErreurConnexion.render());
		}
	}

	/**
	 * Fonction statique qui permet de recuperer le nombre de reponse juste par
	 * question
	 * 
	 * @param listeRep
	 *            la liste des reponses au qcm
	 * @return une HashMap contenant la Question et le nombre de reponse juste
	 */
	public static Map<Question, Integer> reponsesJustesQuestions(
			final List<UtilisateurQcm> listeRep) {
		if (listeRep.isEmpty()) {
			return null;
		}
		Map<Question, Integer> repJustes = new HashMap<Question, Integer>();
		Map<Question, Double> reponse = null;
		for (UtilisateurQcm userQcm : listeRep) {
			reponse = PasserQCM.correction(userQcm.getUtilisateur()
					.getIdUtilisateur(), userQcm.getQcm().getIdQcm());
			for (Question question : userQcm.getQcm().getListeQuestions()) {
				System.out.println(reponse.get(question));
				if (repJustes.containsKey(question)) {
					if (reponse.get(question) > 0) {
						repJustes.put(question, repJustes.get(question) + 1);
					}
				} else {
					if (reponse.get(question) > 0) {
						repJustes.put(question, 1);
					} else {
						repJustes.put(question, 0);
					}
				}
			}

		}
		return repJustes;
	}
}